#pragma once
#ifndef _LINAL_GAUSS_
#define _LINAL_GAUSS_

//================================================================================================================================
//================================================================================================================================
// Локальные
#include "linal/vector.h"
#include "linal/csrmatrix.h"
#include "core_global.h"

//================================================================================================================================
//================================================================================================================================
namespace linal
{
    /// Реализация решения СЛАУ методом Гаусса.
    /// \remarks Класс (на данный момент) является вспомогательным. Используется для решения верхне- и нижнетреугольных СЛАУ.
    class CORE_EXPORT Gauss
    {
    public:
        /// Решение СЛАУ с нижнетреугольной матрицей в разреженном строчном формате.
        /// \param matrix Нижнетругольная матрица в разреженно-строчном формате.
        /// \remarks Даже если матрица \e matrix не является нижнетреугольной, верхний треугольник матрицы игнорируется.
        /// \param [in,out] f На входе - правая часть СЛАУ. На выходе - решение СЛАУ.
        static void solveLowSLAE(const CSRMatrix &matrix, Vector &f);

        /// Решение СЛАУ с верхнетреугольной матрицей в разреженном строчном формате.
        /// \param matrix Верхнетреугольная матрица в разреженно-строчном формате.
        /// \remarks Даже если матрица \e matrix не является верхнетреугольной, нижний треугольник матрицы игнорируется.
        /// \param [in,out] f На входе - правая часть СЛАУ. На выходе - решение СЛАУ.
        static void solveUpSLAE(const CSRMatrix &matrix, Vector &f);
    };
}

#endif // _LINAL_GAUSS_
